package com.guo.loadinganim;

import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.LinearLayout;

import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.List;

/**
 * 实现灵动岛View的基类<P/>
 * 内部封装共享View的尺寸/位置 参数封装<P/>
 */
public class BaseTopView extends LinearLayout {
    private static final String TAG = "BaseTopView";
    //共享元素视图列表:作为源
    private List<View> mTransitionViews = new ArrayList<>();
    //共享元素的参数信息列表：源数据
    private List<SharedElementsParam> mSrcElementsParamList = new ArrayList<>();
    //共享元素动效参数信息列表:源+目的数据


    public BaseTopView(Context context) {
        super(context);
        initTransitionParam();
    }

    public BaseTopView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initTransitionParam();
    }

    public BaseTopView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initTransitionParam();
    }

    private void initTransitionParam(){
        fetchTransitionView(this);
        fetchSourceParam();
    }

    /**
     * 附带源参数，由外部创建了对象之后传入，内部随后附带目的地参数并执行动画
     * @param option 内置源参数
     */
//    public void attachOptions(Bundle option){
//        findViewsWithText();
//    }

    /**
     * 寻找视图内部的共享元素集合
     * @param parent
     */
    private void fetchTransitionView(ViewGroup parent){
        int size = parent.getChildCount();
        for(int i = 0; i < size; i++){
            View view = getChildAt(i);
            if(view instanceof ViewGroup){
                fetchTransitionView((ViewGroup)view);
            }else if(null != view.getTransitionName() && !"".equals(view.getTransitionName())){
                //找到被设置为共享元素的view
                mTransitionViews.add(view);
                Log.d(TAG, "transition view name = " + view.getTransitionName() + ", id = "+view.getId());
            }
        }
    }

    /**
     * 收集共享元素的参数信息
     */
    private void fetchSourceParam(){
        //对共享元素设置preDraw监听
        if(mTransitionViews.size() > 0){
            int[] loc = new int[2];
            for(int i = 0; i < mTransitionViews.size(); i++){
                View view = mTransitionViews.get(i);
                view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        view.getViewTreeObserver().removeOnPreDrawListener(this);
                        SharedElementsParam elementsParam = new SharedElementsParam();
                        view.getLocationOnScreen(loc);
                        elementsParam.setTransitionName(view.getTransitionName());
                        elementsParam.setX(loc[0]);
                        elementsParam.setY(loc[1]);
                        elementsParam.setWidth(view.getMeasuredWidth());
                        elementsParam.setHeight(view.getMeasuredHeight());
                        mSrcElementsParamList.add(elementsParam);
                        return false;
                    }
                });
            }
        }
    }

    /**
     * 获取共享元素信息列表
     * @return 元素信息列表
     */
    public List<SharedElementsParam> getSrcElementsParamList() {
        return mSrcElementsParamList;
    }


}
